﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "ProjectReferenceTypeOfReferencePlane.h"
#include "OwnerPtr.h"
#include "ReferencePlaneType.h"
#include "ElementCreationOptions.h"

namespace gcmp
{
    class Coordinate3d;
    class IPlane;
    class IGraphicsNodeReference;
    /// \brief 参照平面的接口。
    class GCMP_MODEL_INTERFACE_EXPORT IReferencePlane : public IElement
    {
        DEFINE_CAST_DERIVED(gcmp::IReferencePlane, gcmp::IElement);
    public:
        /// \brief 析构函数。
        virtual ~IReferencePlane();
#pragma region Static
        /// \brief 获取所有参照平面。
        /// 获取所有参照平面的指针。
        /// \param pDoc 文档指针。
        /// \return 返回参照平面的接口指针数组。
        static std::vector<IReferencePlane*> GetAllReferencePlanes(const IDocument* pDoc);
        /// \brief 获取所有参照平面Id。
        ///
        /// 获取所有参照平面的Id。
        /// \param pDoc 文档指针。
        /// \return 返回参照平面的ElmentId数组。
        static std::vector<ElementId> GetAllReferencePlaneIds(const IDocument* pDoc);

        /// \brief 创建参照平面。
        /// 通过已有的Plane，创建一个参照平面。
        /// \param pDoc 文档指针。
        /// \param pPlane 参照平面的Plane。
        /// \param eco Element的创建选项
        /// \return 返回一个参照平面的接口指针。
        static IReferencePlane* Create(
            IDocument* pDoc,
            const IPlane* pPlane,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 
        /// \param pDoc
        /// \param graphicsNodeReference
        /// \param eco Element的创建选项
        /// \return 
        static IReferencePlane* CreateByGraphicsNodeReference(
            IDocument* pDoc,
            const IGraphicsNodeReference& graphicsNodeReference,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

#pragma endregion Static
        /// \brief 获取参照平面的可见部分UV最小值。
        ///
        /// \return 返回参照平面的可见部分UV最小值。
        virtual Vector2d GetVisibleUVMin() const = 0;

        /// \brief 获取参照平面的可见部分UV最大值。
        ///
        /// \return 返回参照平面的可见部分UV最大值。
        virtual Vector2d GetVisibleUVMax() const = 0;

        /// \brief 设置参照平面的可见部分UV最小值。
        ///
        /// \return 如果成功，返回true；否则，返回false。
        virtual bool SetVisibleUVMin(const Vector2d& uvMin) = 0;

        /// \brief 设置参照平面的可见部分UV最大值。
        /// \return 如果成功，返回true；否则，返回false。
        virtual bool SetVisibleUVMax(const Vector2d& uvMax) = 0;

        /// \brief 获取参照平面的项目参照类型。
        /// 项目参照类型决定了族中的这个参考平面在族加载到项目之后会不会作为项目的参考。
        /// \return 返回参照平面的项目参照类型。
        virtual ProjectReferenceTypeOfReferencePlane GetProjectReferenceType() const = 0;

        /// \brief 设置参照平面的项目参照类型
        /// \param nType 新的项目参照类型
        /// \return void
        virtual void SetProjectReferenceType(ProjectReferenceTypeOfReferencePlane nType) = 0;

        /// \brief 获取参照平面的几何平面。
        /// \return 返回参照平面的几何平面的const指针。
        virtual const IPlane* GetGeometryPlane() const = 0;

        //web版为了编译通过，增加的临时方法
        virtual void MarkGeometryPlaneRdId() = 0;

        /// \brief 获取参照平面的几何平面。
        /// \return 返回参照平面的几何平面的指针。
        virtual IPlane* GetGeometryPlaneFw() = 0;

        /// \brief 设置参照平面的几何平面。
        /// \param upGPlane 新的几何平面。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetGeometryPlane(OwnerPtr<IPlane> upGPlane) = 0;

        /// \brief 获取参照平面引用的对象。
        /// \return 返回参照平面引用的对象的引用。
        virtual OwnerPtr<gcmp::IGraphicsNodeReference> GetReferencedObject() const = 0;

        /// \brief 获取参照平面的类型。
        /// \return 返回参照平面的类型。
        virtual ReferencePlaneType GetReferencePlaneType() const = 0;

        /// \brief 设置参照平面的类型。
        /// \param nType 参照平面的类型。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetReferencePlaneType(ReferencePlaneType nType) = 0;

        /// \brief 获取参照平面的是不是固定。
        /// \return 如果固定，则返回true；否则返回false。
        virtual bool GetIsFixed() const = 0;

        /// \brief 设置参照平面的是否固定。
        /// \param bFixed 参照平面的是否固定。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetIsFixed(bool bFixed) = 0;

        /// \brief 获取参照平面的几何平面的RegenDataId。
        /// \return 返回参照平面的几何平面的RegenDataId。
        virtual RegenDataId GetGeometryPlaneRdId() const = 0;


        /// \brief 设置位置报告组件
        /// \param opElementPositionReportComponent 位置报告组件
        /// \return bool
        virtual bool SetElementPositionReportComponent(OwnerPtr<IElementPositionReportComponent> opElementPositionReportComponent) = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();
    };
}



